// 对 axios 进行封装处理
import axios from 'axios';

// 1. 在 axios 的基础之上创建了一个新的 axios 实例：instance
const instance = axios.create({
    baseURL: 'http://localhost:3000',
    timeout: 5000
});

// 2. 配置 axios 请求拦截器
instance.interceptors.request.use((config) => {
    // 拦截成功
    // 2.1 获取 token
    const token = localStorage.token;
    // 2.2 将 token 添加到请求头的 Authorization 属性中
    config.headers.Authorization = 'Bearer ' + token;
    return config;
}, (err) => {
    // 拦截失败
    return err;
});

// 3. 配置 axios 响应拦截器
instance.interceptors.response.use((res) => {
    // 响应成功
    return res; // { data: {} }
}, (err) => {
    // 响应失败
    // 判断错误类型，并将错误的描述添加到 err.message 属性上
    if (err && err.response) {
        switch (err.response.status) {
            case 400: err.message = '请求错误(400)'; break;
            case 401: err.message = '身份认证失败(401)'; break;
            case 403: err.message = '拒绝访问(403)'; break;
            case 404: err.message = '请求出错(404)'; break;
            case 408: err.message = '请求超时(408)'; break;
            case 500: err.message = '服务器错误(500)'; break;
            case 501: err.message = '服务未实现(501)'; break;
            case 502: err.message = '网络错误(502)'; break;
            case 503: err.message = '服务不可用(503)'; break;
            case 504: err.message = '网络超时(504)'; break;
            case 505: err.message = 'HTTP版本不受支持(505)'; break;
            default: err.message = `连接出错(${err.response.status})!`;
        }
        return {
            data: {
                status: 0,
                type: err.response.status,
                message: err.message
            }
        }
    } else {
        err.message = '服务器连接失败！';
        return {
            data: {
                status: 0,
                message: err.message
            }
        }
    }
});

// 将创建和配置完成的新的 axios 实例暴露出去
export default instance;